[HNCTF 2022 WEEK3] smash 复现
smash
查看保护机制,正如题目的名字 smash(所以会涉及到花式栈溢出 stack smash),打开了 NX 和 canary

IDA 一下,发现 gets 函数造成了溢出,并且 flag 存在 buf 里面

接下来我们就需要了解一下 stack smash(花式栈溢出技巧 - CTF Wiki (ctf-wiki.org))
Stack smash
在程序加了 canary 保护之后,如果我们读取的 buffer 覆盖了对应的值时,程序就会报错,而一般来说我们并不会关心报错信息。而 stack smash 技巧则就是利用打印这一信息的程序来得到我们想要的内容。这是因为在程序启动 canary 保护之后,如果发现 canary 被修改的话,程序就会执行
__stack_chk_fail函数来打印argv[0]指针所指向的字符串,正常情况下,这个指针指向了程序名。
当我们了解了 Stack smash 后,我们就可以溢出到 arg[0],然后将该指针改成 buf 就能获得 flag,下面就开始求偏移。

两个地址相减就可得偏移 0x208(但是正确的偏移是 0x1f8,比正确的偏移多了 0x10,问了下学长可能是版本的问题,方法会了就行,小问题不伤大雅)

也可以这样算

exp如下:
from pwn import * |
总结:
这题感觉稍微了解了 Stack smash 这种花式栈溢出的方法,这题理解起来比较友好,其他的题像网鼎杯那道相同的方法的不太好理解,总之就是自己知识储备不够,加油,卷起来,冲冲冲!!!